<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<script>
    /**
     * 同步 | 异步  --> 他们的本质区别: 这条流水线上各个流程的执行顺序不同
     * #
     * JS的异步是通过回调函数实现的
     * 通常来说, 异步任务有以下类型
     * 1.普通事件, 如click、resize等
     * 2.资源加载, 如load、error等
     * 3.定时器, 包括setInterval、setTimeOut等
     * 异步任务相关回调函数, 添加到任务队列中
     */

    /**
     * JS执行机制
     * 1.先执行执行栈中的同步任务.   [同步任务都是在主线程上执行, 形成一个执行栈]
     * 2.遇到异步任务(回调函数), 将他们放入任务队列
     * 3.一旦执行栈中的所有同步任务执行完毕, 系统就会按次序读取任务队列中异步任务,
     *  于是被读取的异步任务结束等待状态, 进入执行栈, 开始执行
     */


    // 第一个问题
    // console.log(1)
    //
    // setTimeout(function () {
    //     console.log(3)
    // }, 1000);
    //
    // console.log(2)

    // 第二个问题
    console.log(1)

    // 回调函数, 不属于同步任务, 是异步任务
    setTimeout(function () {
        console.log(3)
    }, 0);

    console.log(2)
</script>
</body>
</html>
